// 引入配置
const GLOBAL_CONFIG = require('@/common/config');

/**
 * 假装是个代理方法
 * @param {HttpRequestConfig} config 请求配置
 * @param {String} regExp 代理匹配前缀 
 * @param {String} target 代理服务器地址
 * @returns 新的请求配置
 */
function proxy(config, regExp, target) {
	const pattern = new RegExp(regExp);
	if (pattern.test(config.url)) {
		config.url = config.url.replace(pattern, '');
		config.baseURL = target;
	}
	return config;
}

module.exports = vm => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置 */
		config.baseURL = GLOBAL_CONFIG.baseUrl; /* 根域名 */

		config.dataType = 'json'; // 设置为json，返回后会对数据进行一次JSON.parse()
		// 配置请求头信息
		config.header = {
			'content-type': 'application/json',
		};
		return config;
	});

	// 请求拦截器
	uni.$u.http.interceptors.request.use(
		async config => { // 可使用async await 做异步操作
				// 在这里判断config.url的前缀 修改baseUrl
				config = proxy(config, '^/server_2/', GLOBAL_CONFIG.marketingBaseUrl); // 多个服务器配置
				config = proxy(config, '^/server_3/', GLOBAL_CONFIG.examBaseUrl); // 多个服务器配置

				// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
				config.data = config.data || {}
				config.params = config.params || {}

				//先暂时写个假的
				// config.header.userType = "1";
				// config.header.token = "77e758b6736b43829e6b659691ec4638M2ZK5WOWMqSEsPSh0KW0rw==";//长租用的token
				// config.header.token = "ocM-Q4kzk-FOWFCaUahHMsl_vTAE";
				// config.header.token = "ocM-Q4jpWOvtOLJ0uIUuGT8gJOM4";//我自己的
				// config.header.userId = "1";
				config.header.tenantId = GLOBAL_CONFIG.tenantId;
				config.header.tenantCode = GLOBAL_CONFIG.tenantCode;

				// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
				// if (vm.$store.state.user.openid) {
				// 	config.header.token = vm.$store.state.user.openid;
				// }

				if (vm.$store.state.user.memberToken) {
					config.header.memberToken = vm.$store.state.user.memberToken;
				}
				if (vm.$store.state.user.accessToken || uni.getStorageSync('accessToken')) {
					config.header.accessToken = vm.$store.state.user.accessToken || uni.getStorageSync('accessToken');
				}

				return config
			},
			error => Promise.reject(error) // 可使用async await 做异步操作
	)

	// 响应拦截器
	uni.$u.http.interceptors.response.use(
		async response => {
				/* 对响应成功做点什么 可使用async await 做异步操作*/
				const data = response.data
				// 自定义参数

				const custom = response.config?.custom
				if (response.statusCode !== 200) { // 服务端返回的状态码不等于200，则reject()
					// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
					if (custom.toast !== false) {
						uni.$u.toast(data.msg)
					}
					// 如果需要catch返回，则进行reject
					if (custom?.catch) {
						return Promise.reject(data)
					} else {
						// 否则返回一个pending中的promise
						return new Promise(() => {})
					}
				} else {

					if (response.config.baseURL.indexOf(('trainApi/')) > -1) {
						if (data.code != 200) {
							if (custom.toast !== false && !uni.$u.test.isEmpty(data.msg)) {
								uni.$u.toast(data.msg)
							}
							return Promise.reject(data.msg)
						}
					} else {
						if (data.code != 1) {
							if (custom.toast !== false && !uni.$u.test.isEmpty(data.msg)) {
								uni.$u.toast(data.msg)
							}
							if(data.code !== 401){
								this.$store.commit('user/saveOpenid', '');
								this.$store.commit('user/saveUserInfo', {});
								uni.clearStorageSync();
							}
							return Promise.reject(data.msg)
						}
					}


				}
				return data.data == null || data.data == undefined ? {} : data.data;
			},
			error => Promise.reject(error) // 可使用async await 做异步操作
	)
}
